package SingletonPattern;

/**
 * 7.单例模式 双重检查锁
 * 线程安全 效率高
 */
public class DoubleCheckSingleton {
    // 1.volatile关键字修饰 类的对象(也是私有静态变量)
    //保证内存可见性
    //保证了不同线程对该变量进行操作的可见性，即一个线程修改了，另一个线程立即可见
    //可理解为一个轻量级的synchronized ；语法上volatile只能用于修饰变量
    private static volatile DoubleCheckSingleton instance;

    // 2.私有化构造函数
    private DoubleCheckSingleton() {
        //...
    }

    // 3.第二次判断为同步代码块
    public static DoubleCheckSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}
